package com.leyou.trade.service.impl;

import com.leyou.common.exception.LyException;
import com.leyou.trade.entity.CartItem;
import com.leyou.trade.repository.CartRepository;
import com.leyou.trade.service.CartService;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;

/**
 * @ClassName : CartServiceImpl  //类名
 * @Description :   //描述
 * @Author : qingfeng  //作者
 * @Date: 2020-09-22 20:29  //时间
 */
@Service
public class CartServiceImpl implements CartService {

    private final CartRepository repository;

    public CartServiceImpl(CartRepository repository) {
        this.repository = repository;
    }

    @Override
    public void saveCartItem(CartItem cartItem) {
        //1.先获取之前的购物车数据
        Optional<CartItem> optional = repository.findById(cartItem.getSkuId());
        //2.判断是否存在
        if (optional.isPresent()) {
            //2.1 存在，记录新的商品数量
            Integer num = cartItem.getNum();
            //2.2 获取旧的数据
            cartItem = optional.get();
            //2.3 数量累加
            cartItem.setNum(num + cartItem.getNum());
        }
        repository.save(cartItem);
    }

    @Override
    public List<CartItem> queryCartList() {
        /**
         * @Description //TODO 查询购物车列表
         * @Param []
         * @return java.util.List<com.leyou.trade.entity.CartItem>
         */
        return repository.findAll();
    }

    @Override
    public void updateNum(Long skuId, Integer num) {
        /**
         * @Description //TODO 更新购物车指定商品的数量
         * @Param [skuId, num]
         * @return void
         */
        //查询以前的购物车数据
        Optional<CartItem> optional = repository.findById(skuId);
        if (!optional.isPresent()){
            throw new LyException(400,"商品不存在！");
        }
        //存在则修改
        CartItem cartItem = optional.get();
        cartItem.setNum(num);
        repository.save(cartItem);
    }

    @Override
    public void deleteCart(Long skuId) {
        /**
         * @Description //TODO 删除购物车指定商品
         * @Param [skuId]
         * @return void
         */
        repository.deleteById(skuId);
    }

    @Override
    public void addCartItemList(List<CartItem> itemList) {
        /**
         * @Description //TODO 批量添加购物车
         * @Param [itemList]
         * @return void
         */
        //1.批量对购物车商品做判断和处理
        List<CartItem> list = itemList.stream().map(this::saveOrUpdateCartItem).collect(Collectors.toList());
        //2.批量写入mongoDB
        repository.saveAll(list);
    }

    private CartItem saveOrUpdateCartItem(CartItem cartItem){
        //1.先获取之前的购物车数据
        Optional<CartItem> optional = repository.findById(cartItem.getSkuId());
        //2.判断是否存在
        if (optional.isPresent()){
            //2.1 存在，记录新的商品数量
            Integer num = cartItem.getNum();
            //2.2 获取旧的数据
            cartItem = optional.get();
            //2.3 数量累加
            cartItem.setNum(num + cartItem.getNum());
        }
        return cartItem;
    }
}
